package com.atguigu.springcloud.lb;

import org.springframework.cloud.client.ServiceInstance;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author xiaolong
 * @version 1.0
 * @description: 轮询算法的实现
 * @date 2021/9/9 16:23
 */
@Component
public class MyLB implements LoadBalancer {


    //设置当前期望初始值
    private AtomicInteger atomicInteger = new AtomicInteger(0);

    public final int getAndIncrement() {
        int curent;
        int next;
        do {
            //当前期望值
            curent = this.atomicInteger.get();
            //更新值   （当期望值大于2147483647为integer最大值为next为0否则+1）
            next = curent >= 2147483647 ? 0 : curent + 1;
            //第一次0更新为1 退出循环，
        } while (!this.atomicInteger.compareAndSet(curent, next));
        System.out.println("*****第几次访问，次数next: " + next);
        return next;
    }

    //负载均衡算法，rest接口第几次请求数% 服务器集群总数数量 = 实际服务器list下标   每次重启rest为接口计数为0；
    public ServiceInstance instances(List<ServiceInstance> serviceInstances) {
        //serviceInstances.size（）代表机器总数     第一次访问1%2 = 1  返回第list列表中第一台主机，
        int index = getAndIncrement() % serviceInstances.size();
        return serviceInstances.get(index);
    }
}
